static void viosapic_deliver(struct viosapic *viosapic, int irq)
{
- uint16_t dest = viosapic->redirtbl[irq].dest_id;
- uint8_t delivery_mode = viosapic->redirtbl[irq].delivery_mode;
- uint8_t vector = viosapic->redirtbl[irq].vector;
+ uint16_t dest = viosapic->redirtbl[irq].fields.dest_id;
+ uint8_t delivery_mode = viosapic->redirtbl[irq].fields.delivery_mode;
+ uint8_t vector = viosapic->redirtbl[irq].fields.vector;
ASSERT(spin_is_locked(&viosapic->lock));
ASSERT(spin_is_locked(&viosapic->lock));
for ( i = 0; i < VIOSAPIC_NUM_PINS; i++ )
- if ( viosapic->redirtbl[i].vector == vector )
+ if ( viosapic->redirtbl[i].fields.vector == vector )
return i;
return -1;
while ( (irq = iosapic_get_highest_irq(viosapic)) != -1 )
{
- if ( viosapic->redirtbl[irq].trig_mode == SAPIC_LEVEL )
+ if ( viosapic->redirtbl[irq].fields.trig_mode == SAPIC_LEVEL )
viosapic->isr |= (1UL << irq);
viosapic_deliver(viosapic, irq);
if ( !test_and_clear_bit(redir_num, &viosapic->isr) )
{
spin_unlock(&viosapic->lock);
- if ( viosapic->redirtbl[redir_num].trig_mode == SAPIC_LEVEL )
+ if ( viosapic->redirtbl[redir_num].fields.trig_mode == SAPIC_LEVEL )
gdprintk(XENLOG_WARNING, "redir %d not set for %d EOI\n",
redir_num, vector);
return;
for ( i = 0; i < VIOSAPIC_NUM_PINS; i++ )
{
- viosapic->redirtbl[i].mask = 0x1;
+ viosapic->redirtbl[i].fields.mask = 0x1;
}
spin_lock_init(&viosapic->lock);
}
if ( (irq < 0) || (irq >= VIOSAPIC_NUM_PINS) )
goto out;
- if ( viosapic->redirtbl[irq].mask )
+ if ( viosapic->redirtbl[irq].fields.mask )
goto out;
bit = 1UL << irq;
- if ( viosapic->redirtbl[irq].trig_mode == SAPIC_LEVEL )
+ if ( viosapic->redirtbl[irq].fields.trig_mode == SAPIC_LEVEL )
{
if ( level )
viosapic->irr |= bit;
*/
#define VIOSAPIC_NUM_PINS 48
-union viosapic_rte
+/* To share VT-d code which uses vioapic_redir_entry.
+ * Although on ia64 this is for vsapic, but we have to vioapic_redir_entry
+ * instead of viosapic_redir_entry.
+ */
+union vioapic_redir_entry
{
uint64_t bits;
struct {
uint8_t reserved[3];
uint16_t dest_id;
- };
+ } fields;
};
struct hvm_hw_ia64_viosapic {
uint32_t pad;
uint64_t lowest_vcpu_id;
uint64_t base_address;
- union viosapic_rte redirtbl[VIOSAPIC_NUM_PINS];
+ union vioapic_redir_entry redirtbl[VIOSAPIC_NUM_PINS];
};
DECLARE_HVM_SAVE_TYPE(VIOSAPIC, 6, struct hvm_hw_ia64_viosapic);